{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "F:\\ProgramData\\Anaconda3\\envs\\python\\lib\\site-packages\\sklearn\\ensemble\\weight_boosting.py:29: DeprecationWarning:\n",
      "\n",
      "numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release.\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<script>requirejs.config({paths: { 'plotly': ['https://cdn.plot.ly/plotly-latest.min']},});if(!window.Plotly) {{require(['plotly'],function(plotly) {window.Plotly=plotly;});}}</script>"
      ],
      "text/vnd.plotly.v1+html": [
       "<script>requirejs.config({paths: { 'plotly': ['https://cdn.plot.ly/plotly-latest.min']},});if(!window.Plotly) {{require(['plotly'],function(plotly) {window.Plotly=plotly;});}}</script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import collections\n",
    "import gc\n",
    "import IPython\n",
    "import lightgbm as lgb\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy\n",
    "import numpy as np\n",
    "import pandas\n",
    "import pandas as pd\n",
    "import os\n",
    "import plotly.graph_objs as go\n",
    "import plotly.plotly as py\n",
    "import random\n",
    "#import seaborn\n",
    "#import seaborn as sb\n",
    "import seaborn as sns\n",
    "#import seaborn as snss\n",
    "#import scipy\n",
    "import scipy as sp\n",
    "import scipy.stats as stats\n",
    "import sklearn\n",
    "import statsmodels.api as sm\n",
    "import statsmodels.formula.api as smf\n",
    "import sys\n",
    "import warnings\n",
    "\n",
    "from datetime import date\n",
    "from IPython.display import HTML\n",
    "from lightgbm import LGBMClassifier\n",
    "from lightgbm import plot_importance\n",
    "from pandas import DataFrame\n",
    "from pandas import Series\n",
    "from patsy import dmatrices\n",
    "from plotly import tools\n",
    "from plotly.offline import init_notebook_mode\n",
    "from plotly.offline import iplot\n",
    "from pylab import rcParams\n",
    "from random import choice\n",
    "from random import choices # Python 3.6+\n",
    "from random import sample\n",
    "from scipy.stats import pointbiserialr\n",
    "from scipy.stats import spearmanr\n",
    "from sklearn import datasets\n",
    "from sklearn import model_selection\n",
    "from sklearn import metrics\n",
    "from sklearn import preprocessing\n",
    "#from sklearn.cross_validation import train_test_split\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.metrics import average_precision_score\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.metrics import precision_recall_curve\n",
    "from sklearn.metrics import roc_auc_score\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.model_selection import KFold\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import Imputer\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from statsmodels.stats.outliers_influence import variance_inflation_factor\n",
    "#from xgboost import XGBClassifier\n",
    "from wordcloud import WordCloud\n",
    "\n",
    "init_notebook_mode(connected=True)\n",
    "plt.rcParams.update({'figure.max_open_warning': 200})\n",
    "# Suppress warnings\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "\n",
    "# In a notebook environment, display the plots inline\n",
    "%matplotlib inline\n",
    "# Set some parameters to apply to all plots. These can be overridden in each plot if desired.\n",
    "# Plot size to 14\" x 7\"\n",
    "matplotlib.rc('figure', figsize = (14, 7))\n",
    "# Font size to 14\n",
    "matplotlib.rc('font', size = 14)\n",
    "# Do not display top and right frame lines\n",
    "matplotlib.rc('axes.spines', top = False, right = False)\n",
    "# Remove grid lines\n",
    "matplotlib.rc('axes', grid = False)\n",
    "# Set backgound color to white\n",
    "matplotlib.rc('axes', facecolor = 'white')\n",
    "# emulate the aesthetics of ggplot (a popular plotting package for R)\n",
    "matplotlib.style.use('ggplot')\n",
    "\n",
    "np.set_printoptions(threshold=np.nan)\n",
    "np.set_printoptions(suppress=True, formatter={'float_kind':'{:f}'.format})\n",
    "\n",
    "# https://pandas.pydata.org/pandas-docs/stable/missing_data.html\n",
    "# Note If you want to consider inf and -inf to be “NA” in computations, you can set...\n",
    "#pandas.options.mode.use_inf_as_na = True\n",
    "\n",
    "#import C:/Development/kaggle--home-credit-default-risk/rand_jitter\n",
    "#import C:/Development/kaggle--home-credit-default-risk/draw_feature_distribution\n",
    "\n",
    "# sys.path.insert(0, 'C:/Development/kaggle--home-credit-default-risk/') # ~= sys.path.prepend\n",
    "sys.path.append('C:/Development/kaggle--home-credit-default-risk/')\n",
    "# import rand_jitter\n",
    "# import draw_feature_distribution\n",
    "##from rand_jitter import * # NOTE: added directly to draw_feature_distribution_v2\n",
    "# from draw_feature_distribution import *\n",
    "# from draw_feature_distribution_v1 import *\n",
    "from draw_feature_distribution_v2 import *\n",
    "\n",
    "# C:\\Users\\jbalcomb\\Anaconda3\\lib\\site-packages\\statsmodels\\compat\\pandas.py:56: FutureWarning:\n",
    "# The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python version: 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)]\n",
      "pandas version: 0.23.4\n",
      "NumPy version: 1.15.0\n",
      "SciPy version: 1.1.0\n",
      "scikit-learn version: 0.19.1\n",
      "matplotlib version: 2.2.3\n",
      "IPython version: 6.5.0\n"
     ]
    }
   ],
   "source": [
    "print(\"Python version: {}\".format(sys.version))\n",
    "print(\"pandas version: {}\".format(pd.__version__))\n",
    "print(\"NumPy version: {}\".format(np.__version__))\n",
    "print(\"SciPy version: {}\".format(sp.__version__))\n",
    "print(\"scikit-learn version: {}\".format(sklearn.__version__))\n",
    "print(\"matplotlib version: {}\".format(matplotlib.__version__))\n",
    "print(\"IPython version: {}\".format(IPython.__version__))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "RANDOM_SEED = 1234567890\n",
    "random.seed(RANDOM_SEED)\n",
    "np.random.seed(RANDOM_SEED)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using Environment Variable for data_file_path\n",
      "data_file_path:  C:\\Development\\kaggle--home-credit-default-risk\\data\\\n"
     ]
    }
   ],
   "source": [
    "# Set configuration based on environment variables\n",
    "if os.getenv('HCDR_DATA_FILE_PATH'):\n",
    "    print('Using Environment Variable for data_file_path')\n",
    "    data_file_path = os.getenv('HCDR_DATA_FILE_PATH')\n",
    "    data_file_path = os.path.join(data_file_path, '')\n",
    "#TODO(JamesBalcomb): add code to fall back on .config file\n",
    "#else:\n",
    "#    'kaggle--home-credit-default-risk.config'\n",
    "else:\n",
    "    print('Using Hard-Coded Configuration for data_file_path')\n",
    "    data_file_path = 'C:/Development/kaggle--home-credit-default-risk/data/'\n",
    "    data_file_path = os.path.join(data_file_path, '')\n",
    "print('data_file_path: ', data_file_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using Environment Variable for working_directory\n",
      "working_directory:  C:\\Development\\kaggle--home-credit-default-risk\\\n"
     ]
    }
   ],
   "source": [
    "# Set configuration based on environment variables\n",
    "if os.getenv('HCDR_WORKING_DIRECTORY'):\n",
    "    print('Using Environment Variable for working_directory')\n",
    "    working_directory = os.getenv('HCDR_WORKING_DIRECTORY')\n",
    "    working_directory = os.path.join(working_directory, '')\n",
    "#TODO(JamesBalcomb): add code to fall back on .config file\n",
    "#else:\n",
    "#    'kaggle--home-credit-default-risk.config'\n",
    "else:\n",
    "    print('Using Hard-Coded Configuration for working_directory')\n",
    "    working_directory = 'C:/Development/kaggle--home-credit-default-risk/'\n",
    "    working_directory = os.path.join(working_directory, '')\n",
    "print('working_directory: ', working_directory)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['application_test.csv',\n",
       " 'application_train.csv',\n",
       " 'bureau.csv',\n",
       " 'bureau_balance.csv',\n",
       " 'credit_card_balance.csv',\n",
       " 'installments_payments.csv',\n",
       " 'POS_CASH_balance.csv',\n",
       " 'previous_application.csv']"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_file_names = [\n",
    "    'application_test.csv',\n",
    "    'application_train.csv',\n",
    "    'bureau.csv',\n",
    "    'bureau_balance.csv',\n",
    "    'credit_card_balance.csv',\n",
    "    'installments_payments.csv',\n",
    "    'POS_CASH_balance.csv',\n",
    "    'previous_application.csv'\n",
    "]\n",
    "data_file_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['df1', 'application_train.csv'],\n",
       " ['df2', 'application_test.csv'],\n",
       " ['df3', 'bureau.csv'],\n",
       " ['df4', 'bureau_balance.csv'],\n",
       " ['df5', 'credit_card_balance.csv'],\n",
       " ['df6', 'installments_payments.csv'],\n",
       " ['df7', 'POS_CASH_balance.csv'],\n",
       " ['df8', 'previous_application.csv']]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_dataframe_names_and_files = [\n",
    "    ['df1','application_train.csv'],\n",
    "    ['df2','application_test.csv'],\n",
    "    ['df3','bureau.csv'],\n",
    "    ['df4','bureau_balance.csv'],\n",
    "    ['df5','credit_card_balance.csv'],\n",
    "    ['df6','installments_payments.csv'],\n",
    "    ['df7','POS_CASH_balance.csv'],\n",
    "    ['df8','previous_application.csv']\n",
    "]\n",
    "df_dataframe_names_and_files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['ds1', 'application_train.csv'],\n",
       " ['ds2', 'application_test.csv'],\n",
       " ['ds3', 'bureau.csv'],\n",
       " ['ds4', 'bureau_balance.csv'],\n",
       " ['ds5', 'credit_card_balance.csv'],\n",
       " ['ds6', 'installments_payments.csv'],\n",
       " ['ds7', 'POS_CASH_balance.csv'],\n",
       " ['ds8', 'previous_application.csv']]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_dataset_names_and_files = [\n",
    "    ['ds1','application_train.csv'],\n",
    "    ['ds2','application_test.csv'],\n",
    "    ['ds3','bureau.csv'],\n",
    "    ['ds4','bureau_balance.csv'],\n",
    "    ['ds5','credit_card_balance.csv'],\n",
    "    ['ds6','installments_payments.csv'],\n",
    "    ['ds7','POS_CASH_balance.csv'],\n",
    "    ['ds8','previous_application.csv']\n",
    "]\n",
    "df_dataset_names_and_files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data_file_name:  application_train.csv\n"
     ]
    }
   ],
   "source": [
    "# TODO(JamesBalcomb): add a function that handles specifying multiple files\n",
    "data_file_name = 'application_train.csv'\n",
    "print('data_file_name: ', data_file_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_table(\n",
    "        data_file_path + data_file_name,\n",
    "        sep=',',\n",
    "        dtype={\n",
    "                'AMT_ANNUITY':'float64',\n",
    "                'AMT_CREDIT':'float64',\n",
    "                'AMT_GOODS_PRICE':'float64',\n",
    "                'AMT_INCOME_TOTAL':'float64',\n",
    "                'AMT_REQ_CREDIT_BUREAU_DAY':'float64',\n",
    "                'AMT_REQ_CREDIT_BUREAU_HOUR':'float64',\n",
    "                'AMT_REQ_CREDIT_BUREAU_MON':'float64',\n",
    "                'AMT_REQ_CREDIT_BUREAU_QRT':'float64',\n",
    "                'AMT_REQ_CREDIT_BUREAU_WEEK':'float64',\n",
    "                'AMT_REQ_CREDIT_BUREAU_YEAR':'float64',\n",
    "                'APARTMENTS_AVG':'float64',\n",
    "                'APARTMENTS_MEDI':'float64',\n",
    "                'APARTMENTS_MODE':'float64',\n",
    "                'BASEMENTAREA_AVG':'float64',\n",
    "                'BASEMENTAREA_MEDI':'float64',\n",
    "                'BASEMENTAREA_MODE':'float64',\n",
    "                'CNT_CHILDREN':'float64',\n",
    "                'CNT_FAM_MEMBERS':'float64',\n",
    "                'CODE_GENDER':'object',\n",
    "                'COMMONAREA_AVG':'float64',\n",
    "                'COMMONAREA_MEDI':'float64',\n",
    "                'COMMONAREA_MODE':'float64',\n",
    "                'DAYS_BIRTH':'float64',\n",
    "                'DAYS_EMPLOYED':'float64',\n",
    "                'DAYS_ID_PUBLISH':'float64',\n",
    "                'DAYS_LAST_PHONE_CHANGE':'float64',\n",
    "                'DAYS_REGISTRATION':'float64',\n",
    "                'DEF_30_CNT_SOCIAL_CIRCLE':'float64',\n",
    "                'DEF_60_CNT_SOCIAL_CIRCLE':'float64',\n",
    "                'ELEVATORS_AVG':'float64',\n",
    "                'ELEVATORS_MEDI':'float64',\n",
    "                'ELEVATORS_MODE':'float64',\n",
    "                'EMERGENCYSTATE_MODE':'object',\n",
    "                'ENTRANCES_AVG':'float64',\n",
    "                'ENTRANCES_MEDI':'float64',\n",
    "                'ENTRANCES_MODE':'float64',\n",
    "                'EXT_SOURCE_1':'float64',\n",
    "                'EXT_SOURCE_2':'float64',\n",
    "                'EXT_SOURCE_3':'float64',\n",
    "                'FLAG_CONT_MOBILE':'object',\n",
    "                'FLAG_DOCUMENT_2':'object',\n",
    "                'FLAG_DOCUMENT_3':'object',\n",
    "                'FLAG_DOCUMENT_4':'object',\n",
    "                'FLAG_DOCUMENT_5':'object',\n",
    "                'FLAG_DOCUMENT_6':'object',\n",
    "                'FLAG_DOCUMENT_7':'object',\n",
    "                'FLAG_DOCUMENT_8':'object',\n",
    "                'FLAG_DOCUMENT_9':'object',\n",
    "                'FLAG_DOCUMENT_10':'object',\n",
    "                'FLAG_DOCUMENT_11':'object',\n",
    "                'FLAG_DOCUMENT_12':'object',\n",
    "                'FLAG_DOCUMENT_13':'object',\n",
    "                'FLAG_DOCUMENT_14':'object',\n",
    "                'FLAG_DOCUMENT_15':'object',\n",
    "                'FLAG_DOCUMENT_16':'object',\n",
    "                'FLAG_DOCUMENT_17':'object',\n",
    "                'FLAG_DOCUMENT_18':'object',\n",
    "                'FLAG_DOCUMENT_19':'object',\n",
    "                'FLAG_DOCUMENT_20':'object',\n",
    "                'FLAG_DOCUMENT_21':'object',\n",
    "                'FLAG_EMAIL':'object',\n",
    "                'FLAG_EMP_PHONE':'object',\n",
    "                'FLAG_MOBIL':'object',\n",
    "                'FLAG_OWN_CAR':'object',\n",
    "                'FLAG_OWN_REALTY':'object',\n",
    "                'FLAG_PHONE':'object',\n",
    "                'FLAG_WORK_PHONE':'object',\n",
    "                'FLOORSMAX_AVG':'float64',\n",
    "                'FLOORSMAX_MEDI':'float64',\n",
    "                'FLOORSMAX_MODE':'float64',\n",
    "                'FLOORSMIN_AVG':'float64',\n",
    "                'FLOORSMIN_MEDI':'float64',\n",
    "                'FLOORSMIN_MODE':'float64',\n",
    "                'FONDKAPREMONT_MODE':'object',\n",
    "                'HOUR_APPR_PROCESS_START':'float64',\n",
    "                'HOUSETYPE_MODE':'object',\n",
    "                'LANDAREA_AVG':'float64',\n",
    "                'LANDAREA_MEDI':'float64',\n",
    "                'LANDAREA_MODE':'float64',\n",
    "                'LIVE_CITY_NOT_WORK_CITY':'object',\n",
    "                'LIVE_REGION_NOT_WORK_REGION':'object',\n",
    "                'LIVINGAPARTMENTS_AVG':'float64',\n",
    "                'LIVINGAPARTMENTS_MEDI':'float64',\n",
    "                'LIVINGAPARTMENTS_MODE':'float64',\n",
    "                'LIVINGAREA_AVG':'float64',\n",
    "                'LIVINGAREA_MEDI':'float64',\n",
    "                'LIVINGAREA_MODE':'float64',\n",
    "                'NAME_CONTRACT_TYPE':'object',\n",
    "                'NAME_EDUCATION_TYPE':'object',\n",
    "                'NAME_FAMILY_STATUS':'object',\n",
    "                'NAME_HOUSING_TYPE':'object',\n",
    "                'NAME_INCOME_TYPE':'object',\n",
    "                'NAME_TYPE_SUITE':'object',\n",
    "                'NONLIVINGAPARTMENTS_AVG':'float64',\n",
    "                'NONLIVINGAPARTMENTS_MEDI':'float64',\n",
    "                'NONLIVINGAPARTMENTS_MODE':'float64',\n",
    "                'NONLIVINGAREA_AVG':'float64',\n",
    "                'NONLIVINGAREA_MEDI':'float64',\n",
    "                'NONLIVINGAREA_MODE':'float64',\n",
    "                'OBS_30_CNT_SOCIAL_CIRCLE':'float64',\n",
    "                'OBS_60_CNT_SOCIAL_CIRCLE':'float64',\n",
    "                'OCCUPATION_TYPE':'object',\n",
    "                'ORGANIZATION_TYPE':'object',\n",
    "                'OWN_CAR_AGE':'float64',\n",
    "                'REG_CITY_NOT_LIVE_CITY':'object',\n",
    "                'REG_CITY_NOT_WORK_CITY':'object',\n",
    "                'REG_REGION_NOT_LIVE_REGION':'object',\n",
    "                'REG_REGION_NOT_WORK_REGION':'object',\n",
    "                'REGION_POPULATION_RELATIVE':'float64',\n",
    "                'REGION_RATING_CLIENT':'object',\n",
    "                'REGION_RATING_CLIENT_W_CITY':'object',\n",
    "                'SK_ID_CURR':'object',\n",
    "                'TARGET':'object',\n",
    "                'TOTALAREA_MODE':'float64',\n",
    "                'WALLSMATERIAL_MODE':'object',\n",
    "                'WEEKDAY_APPR_PROCESS_START':'object',\n",
    "                'YEARS_BEGINEXPLUATATION_AVG':'float64',\n",
    "                'YEARS_BEGINEXPLUATATION_MEDI':'float64',\n",
    "                'YEARS_BEGINEXPLUATATION_MODE':'float64',\n",
    "                'YEARS_BUILD_AVG':'float64',\n",
    "                'YEARS_BUILD_MEDI':'float64',\n",
    "                'YEARS_BUILD_MODE':'float64'\n",
    "                }\n",
    "        )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#application_test = pd.read_table(data_file_path + 'application_test.csv', sep=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "#application_train = pd.read_table(data_file_path + 'application_train.csv', sep=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "#bureau = pd.read_table(data_file_path + 'bureau.csv', sep=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "#bureau_balance = pd.read_table(data_file_path + 'bureau_balance.csv', sep=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "#credit_card_balance = pd.read_table(data_file_path + 'credit_card_balance.csv', sep=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "#installments_payments = pd.read_table(data_file_path + 'installments_payments.csv', sep=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "#POS_CASH_balance = pd.read_table(data_file_path + 'POS_CASH_balance.csv', sep=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "#previous_application = pd.read_table(data_file_path + 'previous_application.csv', sep=',')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
